package gcp;

import gcp.enums.ClassificacaoEtaria;
import gcp.enums.ItemEstado;
import gcp.enums.TipoDeJogo;

import java.io.Serializable;

/**
 * Jogo<br>
 * Entidade que representa um jogo, esta implementa a interface Colecionavel.
 */
public class Jogo implements Colecionavel, Serializable {
    private int ano;
    private String titulo;
    private String comentarios;
    private String quemPublicou;
    private ClassificacaoEtaria classificacaoEtaria;
    private ItemEstado itemEstado;
    private int nota;

    private static final long serialVersionUID = -2913746425501278810L;
    private TipoDeJogo tipoDeJogo;

    /**
     * Cria um objeto Jogo
     */
    public Jogo() {}

    /**
     * Cria um objeto Jogo.
     * @param titulo Titulo do jogo.
     * @param quemPublicou Quem publicou o jogo.
     * @param ano O ano do jogo.
     * @param classificacaoEtaria A classificaco etaria do jogo.
     * @param tipo O tipo do jogo.
     * @param itemEstado O estado do jogo.
     * @throws Exception Lancada caso o parametros seja nulo ou vazio.
     */
    public Jogo(String titulo, String quemPublicou, int ano,
            ClassificacaoEtaria classificacaoEtaria, TipoDeJogo tipo,
            ItemEstado itemEstado, String comentarios) throws Exception {
        if (titulo == null || titulo.isEmpty())
            throw new Exception("O titulo não pode ser nulo.");
        if (quemPublicou == null || quemPublicou.isEmpty())
            throw new Exception("Quem publicou não pode ser nulo.");
        if (ano <= 0)
            throw new Exception("Ano não pode ser nulo ou negativo.");
        this.titulo = titulo;
        this.quemPublicou = quemPublicou;
        this.ano = ano;
        this.comentarios = comentarios;
        this.itemEstado = itemEstado;
        this.tipoDeJogo = tipo;
    }

    /**
     * Retorna o tipo do jogo.
     * @return tipoDeJogo Tipo do jogo.
     */
    public TipoDeJogo getTipoDeJogo() {
        return tipoDeJogo;
    }

    /**
     * Atualiza o tipo do Jogo para o passado como parametro.
     * @param tipoDeJogo Tipo do jogo a ser atualizado.
     */
    public void setTipoDeJogo(TipoDeJogo tipoDeJogo) {
        this.tipoDeJogo = tipoDeJogo;
    }

    /**
     * Retorna a nota do jogo em relacao a sua qualidade.
     * @return nota A nota dada ao jogo que vai de 0 a 4.
     */
 
    public int getAno() {
        return ano;
    }

    /**
     * Retorna os cometarios a respeito do jogo.
     * @return comentarios Comentarios a respeito do jogo.
     */
   
    public String getComentarios() {
        return comentarios;
    }

    /**
     * Retorna a classsificacao etaria adequada para o jogo.
     * @return esrb A classsificacao etaria adequada para o jogo.
     */
  
    public ClassificacaoEtaria getClassificacaoEtaria() {
        return classificacaoEtaria;
    }

    /**
     * Retorna o estado que o jogo se encontra.
     * @return itemEstado O estado que o jogo se encontra.
     */
  
    public ItemEstado getItemEstado() {
        return itemEstado;
    }

    /**
     * Retorna quem publicou o jogo.
     * @return quemPublicou Quem publicou o jogo.
     */
   
    public String getQuemPublicou() {
        return quemPublicou;
    }

    /**
     * Retorna o titulo do jogo.
     * @return O titulo do jogo.
     */
    
    public String getTitulo() {
        return titulo;
    }

    /**
     * Atualiza a nota do jogo, em relacao a sua qualidade, para a passada como
     * parametro.
     * @param ano - A nota dada ao jogo a ser atualizada.
     */
    
    public void setAno(int ano) {
        this.ano = ano;
    }

    /**
     * Atualiza os cometarios em relacao ao jogo para o passado como parametro.
     * @param comentarios Os cometarios sobre o jogo a ser atualizado.
     */
    
    public void setComentarios(String comentarios) {
        this.comentarios = comentarios;
    }

    /**
     * Atualiza a classificacao etaria do jogo para a passada como parametro.
     * @param classificacaoEtaria - A classificacao etaria do jogo a ser atualizada.
     */
  
    public void setClassificacaoEtaria(ClassificacaoEtaria classificacaoEtaria) {
        this.classificacaoEtaria = classificacaoEtaria;
    }

    /**
     * Atualiza o estado do jogo para o passado como parametro.
     * @param itemEstado O estado do jogo a ser atualizado.
     */
   
    public void setItemEstado(ItemEstado itemEstado) {
        this.itemEstado = itemEstado;
    }

    /**
     * Atualiza quem publicou o jogo para o passado como parametro.
     * @param quemPublicou Quem publicou o jogo.
     */
    
    public void setQuemPublicou(String quemPublicou) {
        this.quemPublicou = quemPublicou;
    }

    /**
     * Atualiza o titulo do jogo para o passado como parametro.
     * @param titulo O titulo do jogo a ser atualizado.
     */
   
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    /**
     * Atualiza a nota do jogo, em relacao a sua qualidade, para a passada como
     * parametro.
     * @param nota A nota dada ao jogo a ser atualizada.
     */
    public void setNota(int nota) {
        this.nota = nota;
    }

    /**
     * Retorna a nota do jogo em relacao a sua qualidade.
     * @return nota A nota dada ao jogo que vai de 0 a 4.
     */
    public int getNota() {
        return nota;
    }

    /**
     * Gera um hashcode para jogo.
     */
   
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((titulo == null) ? 0 : titulo.hashCode());
        return result;
    }

    /**
     * Verifica se um jogo eh igual ao objeto passado como parametro.
     * @param obj - O objeto a ser comparado.
     * @return Rrue, em caso de semelhanca, False caso contrario.
     */
   
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Jogo other = (Jogo) obj;
        if (titulo == null) {
            if (other.titulo != null)
                return false;
        } else if (!titulo.equals(other.titulo))
            return false;
        return true;
    }

    /**
     * Retorna uma representacao String para jogo.
     */
   
    @Override
    public String toString() {
        return "Jogo - " + titulo;
    }
}